using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Raster._RasterDataset
{
    /// <summary>
    /// <para>Generate Raster From Raster Function</para>
    /// <para>Generates a raster dataset from an input raster function or function chain.</para>
    /// <para>根据输入栅格函数或函数链生成栅格数据集。</para>
    /// </summary>    
    [DisplayName("Generate Raster From Raster Function")]
    public class GenerateRasterFromRasterFunction : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GenerateRasterFromRasterFunction()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_raster_function">
        /// <para>Input Raster Function</para>
        /// <para>The name of a raster function, raster function JSON object, or function chain (in .rft.xml format).</para>
        /// <para>栅格函数、栅格函数 JSON 对象或函数链的名称（.rft.xml格式）。</para>
        /// </param>
        /// <param name="_out_raster_dataset">
        /// <para>Output Raster Dataset</para>
        /// <para>The output raster dataset.</para>
        /// <para>输出栅格数据集。</para>
        /// </param>
        public GenerateRasterFromRasterFunction(object _raster_function, object _out_raster_dataset)
        {
            this._raster_function = _raster_function;
            this._out_raster_dataset = _out_raster_dataset;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Generate Raster From Raster Function";

        public override string CallName => "management.GenerateRasterFromRasterFunction";

        public override List<string> AcceptEnvironments => ["cellAlignment", "cellSize", "compression", "extent", "geographicTransformations", "gpuID", "nodata", "outputCoordinateSystem", "parallelProcessingFactor", "processorType", "pyramid", "rasterStatistics", "resamplingMethod", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_raster_function, _out_raster_dataset, _raster_function_arguments, _raster_properties, _format.GetGPValue(), _process_as_multidimensional.GetGPValue()];

        /// <summary>
        /// <para>Input Raster Function</para>
        /// <para>The name of a raster function, raster function JSON object, or function chain (in .rft.xml format).</para>
        /// <para>栅格函数、栅格函数 JSON 对象或函数链的名称（.rft.xml格式）。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Raster Function")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _raster_function { get; set; }


        /// <summary>
        /// <para>Output Raster Dataset</para>
        /// <para>The output raster dataset.</para>
        /// <para>输出栅格数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Raster Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_raster_dataset { get; set; }


        /// <summary>
        /// <para>Raster Function Arguments</para>
        /// <para>The parameters associated with the function chain. For example, if the function chain applies the Hillshade raster function, set the data source, azimuth, and altitude.</para>
        /// <para>与函数链关联的参数。例如，如果函数链应用了 Hillshade 栅格函数，则设置数据源、方位角和海拔高度。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Raster Function Arguments")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _raster_function_arguments { get; set; } = null;


        /// <summary>
        /// <para>Raster Properties</para>
        /// <para>The output raster dataset key properties, such as the sensor or wavelength.</para>
        /// <para>输出栅格数据集关键属性，例如传感器或波长。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Raster Properties")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _raster_properties { get; set; } = null;


        /// <summary>
        /// <para>Format</para>
        /// <para><xdoc>
        ///   <para>The output raster format.</para>
        ///   <para>The default format will be derived from the file extension that was specified in the Output Raster Dataset.</para>
        ///   <bulletList>
        ///     <bullet_item>TIFF—Tagged Image File Format for raster datasets</bullet_item><para/>
        ///     <bullet_item>Cloud Optimized GeoTIFF—Cloud Optimized GeoTIFF format.</bullet_item><para/>
        ///     <bullet_item>ERDAS IMAGINE file—ERDAS IMAGINE raster data format</bullet_item><para/>
        ///     <bullet_item>Esri Grid—Esri Grid raster dataset format</bullet_item><para/>
        ///     <bullet_item>CRF—Cloud Raster Format</bullet_item><para/>
        ///     <bullet_item>MRF—Meta Raster Format</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出栅格格式。</para>
        ///   <para>默认格式将派生自输出栅格数据集中指定的文件扩展名。</para>
        ///   <bulletList>
        ///     <bullet_item>TIFF - 栅格数据集的标记影像文件格式</bullet_item><para/>
        ///     <bullet_item>云优化 GeoTIFF - 云优化 GeoTIFF 格式。</bullet_item><para/>
        ///     <bullet_item>ERDAS IMAGINE 文件 - ERDAS IMAGINE 栅格数据格式</bullet_item><para/>
        ///     <bullet_item>Esri Grid - Esri Grid 栅格数据集格式</bullet_item><para/>
        ///     <bullet_item>CRF - 云栅格格式</bullet_item><para/>
        ///     <bullet_item>MRF - 元栅格格式</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Format")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _format_value? _format { get; set; } = null;

        public enum _format_value
        {
            /// <summary>
            /// <para>TIFF</para>
            /// <para>TIFF—Tagged Image File Format for raster datasets</para>
            /// <para>TIFF - 栅格数据集的标记影像文件格式</para>
            /// </summary>
            [Description("TIFF")]
            [GPEnumValue("TIFF")]
            _TIFF,

            /// <summary>
            /// <para>Cloud Optimized GeoTIFF</para>
            /// <para>Cloud Optimized GeoTIFF—Cloud Optimized GeoTIFF format.</para>
            /// <para>云优化 GeoTIFF - 云优化 GeoTIFF 格式。</para>
            /// </summary>
            [Description("Cloud Optimized GeoTIFF")]
            [GPEnumValue("COG")]
            _COG,

            /// <summary>
            /// <para>ERDAS IMAGINE file</para>
            /// <para>ERDAS IMAGINE file—ERDAS IMAGINE raster data format</para>
            /// <para>ERDAS IMAGINE 文件 - ERDAS IMAGINE 栅格数据格式</para>
            /// </summary>
            [Description("ERDAS IMAGINE file")]
            [GPEnumValue("IMAGINE Image")]
            _IMAGINE_Image,

            /// <summary>
            /// <para>Esri Grid</para>
            /// <para>Esri Grid—Esri Grid raster dataset format</para>
            /// <para>Esri Grid - Esri Grid 栅格数据集格式</para>
            /// </summary>
            [Description("Esri Grid")]
            [GPEnumValue("GRID")]
            _GRID,

            /// <summary>
            /// <para>CRF</para>
            /// <para>CRF—Cloud Raster Format</para>
            /// <para>CRF - 云栅格格式</para>
            /// </summary>
            [Description("CRF")]
            [GPEnumValue("CRF")]
            _CRF,

            /// <summary>
            /// <para>MRF</para>
            /// <para>MRF—Meta Raster Format</para>
            /// <para>MRF - 元栅格格式</para>
            /// </summary>
            [Description("MRF")]
            [GPEnumValue("MRF")]
            _MRF,

        }

        /// <summary>
        /// <para>Process as Multidimensional</para>
        /// <para><xdoc>
        ///   <para>Specifies whether to process the input mosaic dataset as a multidimensional raster dataset.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—The input will not be processed as a multidimensional raster dataset. If the input is multidimensional, only the slice that is currently displayed will be processed. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—The input will be processed as a multidimensional raster dataset and all slices will be processed to produce a new multidimensional raster dataset. The output Format must be set to Cloud raster format to use this option.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否将输入镶嵌数据集作为多维栅格数据集进行处理。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 输入不会作为多维栅格数据集进行处理。如果输入是多维的，则仅处理当前显示的切片。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中—输入将作为多维栅格数据集进行处理，并将对所有切片进行处理以生成新的多维栅格数据集。必须将输出格式设置为云栅格格式才能使用此选项。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Process as Multidimensional")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _process_as_multidimensional_value _process_as_multidimensional { get; set; } = _process_as_multidimensional_value._false;

        public enum _process_as_multidimensional_value
        {
            /// <summary>
            /// <para>ALL_SLICES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ALL_SLICES")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>CURRENT_SLICE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("CURRENT_SLICE")]
            [GPEnumValue("false")]
            _false,

        }

        public GenerateRasterFromRasterFunction SetEnv(object cellSize = null, object compression = null, object extent = null, object geographicTransformations = null, object nodata = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object pyramid = null, object rasterStatistics = null, object resamplingMethod = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(cellSize: cellSize, compression: compression, extent: extent, geographicTransformations: geographicTransformations, nodata: nodata, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, pyramid: pyramid, rasterStatistics: rasterStatistics, resamplingMethod: resamplingMethod, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}